// 事件延迟技术：节流与防抖

// 对事件回调函数的约束
interface EventCallFunc{
  (event:MouseEvent):void;
}


// 节流: 一个间时段内仅执行一次（先执行，后等待）
export function jieliu(func:EventCallFunc, offsetTime:number=1000){

  //标记时间戳
  let markTime:number=0;

  // 真正的回调函数
  return function(event:MouseEvent){
    let _this = event.target;

    // 当前时间戳
    let now = new Date().getTime();

    // 超过时间间隔
    if(now-markTime>offsetTime){
      // 调用回调函数（重置this为触发对象）
      func.call(_this, event);
      markTime = now;
    }

  }

}


// 防抖: 触发事件，会有一个延迟执行时间，如果在这个时间段内又触发，则重新延迟，直到延迟时间结束则执行（先等待，后执行）
export function fangdou(func:EventCallFunc, offsetTime:number=1000){

  // 定时器（默认0表示不存在）
  let timer:number=0;

  return function(event:MouseEvent){

    let _this = event.target;

    if(timer){//清除旧的延迟
      clearTimeout(timer);
    }

    //每次点击均向后延迟
    timer = setTimeout(()=>{
      // 调用回调函数（重置this为触发对象）
      func.call(_this, event);
    }, offsetTime);

    console.log(timer);

  }

}

